import * as PIXI from 'pixi.js';
import { IResourceManager } from '../types/IResourceManager';

/**
 * 资源管理器实现
 * 
 * 负责管理PixiJS纹理资源的加载、缓存和预加载功能
 * 实现了IResourceManager接口，提供统一的资源管理API
 */
export class ResourceManager implements IResourceManager {
    /** 纹理资源缓存，使用Map存储已加载的纹理 */
    private resourceCache = new Map<string, PIXI.Texture>();

    /**
     * 加载单个纹理资源
     * 
     * @param path 纹理文件路径
     * @returns Promise<PIXI.Texture> 加载完成的纹理对象
     * 
     * 功能：
     * 1. 检查缓存中是否已存在该纹理
     * 2. 如果不存在，则从指定路径加载纹理
     * 3. 将加载完成的纹理存入缓存
     * 4. 返回纹理对象
     */
    async loadTexture(path: string): Promise<PIXI.Texture> {
        // 检查缓存中是否已存在
        if (this.resourceCache.has(path)) {
            return this.resourceCache.get(path)!;
        }

        return new Promise((resolve, reject) => {
            // 使用PixiJS的Texture.from方法加载纹理
            const texture = PIXI.Texture.from(path);

            // 检查纹理是否已经加载完成
            if (texture.baseTexture.valid) {
                this.resourceCache.set(path, texture);
                resolve(texture);
            } else {
                // 监听加载完成事件
                texture.baseTexture.once('loaded', () => {
                    this.resourceCache.set(path, texture);
                    resolve(texture);
                });
                
                // 监听加载失败事件
                texture.baseTexture.once('error', reject);
            }
        });
    }

    /**
     * 预加载多个纹理资源
     * 
     * @param paths 要预加载的纹理路径数组
     * @returns Promise<void> 所有资源加载完成
     * 
     * 功能：
     * 1. 并行加载多个纹理资源
     * 2. 等待所有资源加载完成
     * 3. 自动缓存所有加载的资源
     */
    async preload(paths: string[]): Promise<void> {
        console.log('开始预加载资源:', paths.length, '个文件');
        
        try {
            // 并行加载所有纹理
            const promises = paths.map(path => this.loadTexture(path));
            await Promise.all(promises);
            
            console.log('资源预加载完成');
        } catch (error) {
            console.warn('资源预加载失败:', error);
            throw error;
        }
    }

    /**
     * 获取缓存状态信息
     * 
     * @returns { cached: number; total: number } 缓存统计信息
     * 
     * 功能：
     * 返回当前缓存中的资源数量和总数量
     * 用于监控资源加载状态
     */
    getCacheStatus(): { cached: number; total: number } {
        const cached = this.resourceCache.size;
        return { cached, total: cached };
    }

    /**
     * 清空资源缓存
     * 
     * 功能：
     * 清除所有已缓存的纹理资源
     * 释放内存，通常在销毁时调用
     */
    clearCache(): void {
        this.resourceCache.clear();
        console.log('资源缓存已清空');
    }
} 